#include "Image.h"

namespace gamekit {

template <int cw, int ch, class C>
struct TileSet
{
public:
	TileSet(const Bitmap* bitmap);
	~TileSet(void);
};


template <int w, int h, class L>
struct Map
{
	template<class C>
	struct Layer
	{
		struct Cell
		{
		private:
			Cell(Layer<C>* layer, const int& x, const int& y, const C& cellType);
		public:
			~Cell(void);

		};

	private:
		Layer(Map* map, const L& layerType);
	public:
		~Layer();

		Layer<C>* cell(const int& x, const int& y, const C& cellType);
		Layer<C>* cell(const int& x, const int& y, const C& cellType, const int& colspan, const int& rowspan);
	};

public:
	Map();
	~Map();

	template<class C, int cw, int ch>
	Layer<C>* layer(const L& layerType, const C& defaultCellType, const TileSet<cw, ch, C>* tileSet);
};

/*====================================================================================*/
/* TileSet */
/*====================================================================================*/

template <int cw, int ch, class C>
TileSet<cw, ch, C>::TileSet(const Bitmap* bitmap)
{

}

template <int cw, int ch, class C>
TileSet<cw, ch, C>::~TileSet(void)
{

}

/*====================================================================================*/
/* Map */
/*====================================================================================*/

template <int w, int h, class L>
Map<w, h, L>::Map()
{

};

template <int w, int h, class L>
Map<w, h, L>::~Map()
{

};

template <int w, int h, class L>
template<class C, int cw, int ch>
typename Map<w, h, L>::Layer<C>* Map<w, h, L>::layer(const L& layerType, const C& cellType, const TileSet<cw, ch, C>* tileSet)
{
	return NULL;
};

/*====================================================================================*/
/* Map::Layer */
/*====================================================================================*/
template <int w, int h, class L>
template<class C>
Map<w, h, L>::Layer<C>::Layer(Map* map, const L& laterType)
{

};

template <int w, int h, class L>
template<class C>
Map<w, h, L>::Layer<C>::~Layer()
{

};

template <int w, int h, class L>
template <class C>
typename Map<w, h, L>::Layer<C>* Map<w, h, L>::Layer<C>::cell(const int& x, const int& y, const C& cellType)
{
	return NULL;
};

template <int w, int h, class L>
template <class C>
typename Map<w, h, L>::Layer<C>* Map<w, h, L>::Layer<C>::cell(const int& x, const int& y, const C& cellType, const int& colspan, const int& rowspan)
{
	return NULL;
}

/*====================================================================================*/
}
